package com.example.springaop.myAop.dynamicProxy;

import com.example.springaop.myAop.ArithmeticCalculator;
import com.example.springaop.myAop.ArithmeticCalculatorImpl;
import com.example.springaop.myAop.MyLogger;

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        // 动态代理实现
        // 注意：我们这里使用的是 JDK 动态代理，要求是必须要实现接口 InvocationHandler

        Object object = new ArithmeticCalculatorImpl();
        MyLogger logger = new MyLogger();
        ObjectInterceptor objectInterceptor = new ObjectInterceptor(object, logger);
        /**
         * 三个参数的含义：
         * 1、目标类的类加载器
         * 2、目标类所有实现的接口
         * 3、拦截器
         */
        ArithmeticCalculator calculator = (ArithmeticCalculator) Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(), objectInterceptor);

        System.out.println(calculator.add(1, 5));

        /*那么使用动态代理来完成这个需求就很好了，后期在 ArithmeticCalculator 中增加业务方法，都不用更改代码就能自动给我们生成代理对象。
        而且将 ArithmeticCalculator 换成别的类也是可以的。也就是做到了代理对象能够代理多个目标类，多个目标方法。

　      注意：我们这里使用的是 JDK 动态代理，要求是必须要实现接口 InvocationHandler。*/

    }
}
